package chapter10;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Java01_Reflect {
    public static void main(String[] args) throws Exception{
        // TODO 反射

        // 多态
        User user = new Child();
        user.test1();
        // 一个对象能调用什么方法不是取决与它自身有什么方法而是取决于它的引用变量类型
        // user.test2();   报错：无法解析 'User' 中的方法 'test2'
        System.out.println("-----------------------");

        // 获取类对象
        Class<? extends User> aClass = user.getClass();
        System.out.println(aClass);
        System.out.println("-----------------------");

        // 获取类名
        System.out.println(aClass.getName());   // chapter10.Child(类的完整名称，包含包名)
        System.out.println(aClass.getSimpleName()); // Child
        System.out.println("-----------------------");

        // 获取包名
        System.out.println(aClass.getPackageName());    // chapter10
        System.out.println("-----------------------");

        // 获取类的父类
        Class<?> superclass = aClass.getSuperclass();
        System.out.println(superclass); // class chapter10.User
        System.out.println("-----------------------");

        // 获取类的接口,返回数组
        Class<?>[] interfaces = aClass.getInterfaces();
        System.out.println(interfaces.length);  // 0
        System.out.println("-----------------------");

        // 获取类的属性
        Field xxx = aClass.getField("xxx"); // public权限的属性
        Field xxx1 = aClass.getDeclaredField("xxx");    // 所有权限的属性
        Field[] fields = aClass.getFields();    // 所有public属性的数组
        System.out.println(fields.length);  // 0
        Field[] declaredFields = aClass.getDeclaredFields();    // 所有声明的属性
        System.out.println(declaredFields.length);  // 0
        System.out.println("-----------------------");

        // 获取类的方法
        Method test1 = aClass.getMethod("test2");    // public权限的方法
        Method test2 = aClass.getDeclaredMethod("test2");   // 所有权限的方法
        Method[] methods = aClass.getMethods();    // 所有public权限的方法
        System.out.println(methods.length); // 11
        Method[] declaredMethods = aClass.getDeclaredMethods(); // 所有声明的方法
        System.out.println(declaredMethods.length); // 1
        System.out.println("-----------------------");

        // 构造方法
        Constructor<? extends User> constructor = aClass.getConstructor();
        Constructor<?>[] constructors = aClass.getConstructors();
        Constructor<? extends User> declaredConstructor = aClass.getDeclaredConstructor();
        Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
        System.out.println("-----------------------");

        // 获取权限(修饰符)：多个修饰符会融合成一个int值
        int modifiers = aClass.getModifiers();
        boolean aPrivate = Modifier.isPrivate(modifiers);
        System.out.println(aPrivate);   // false
        System.out.println("-----------------------");
    }
}
class User {
    public void test1() {
        System.out.println("test1");
    }
}

class Child extends User {
    public void test2() {
        System.out.println("test2");
    }
}